// package main
// import (
// 	"fmt"
// 	"sync"
// 	"time"
// )
// var count int=0
// var wg sync.WaitGroup
// var mutex sync.Mutex
// func test(){
// 	mutex.Lock()
// 	//互斥锁保证线程安全
// 	count++
// 	fmt.Printf("count=%d\n",count)
// 	mutex.Unlock()
// 	time.Sleep(time.Millisecond*100)

// 	wg.Done()
// }
// var map1=make(map[int]int)
// var mutex1 sync.Mutex
// func calc(num int){
// 	mutex1.Lock()
// 	sum:=1
// 	for i:=2;i<=num;i++{
// 		sum*=i
// 	}
// 	map1[num]=sum
// 	fmt.Printf("map[%d]=%d\n",num,map1[num])
// 	mutex1.Unlock()
// 	wg.Done()
// }
// func main(){
// 	for i:=1;i<=20;i++{
// 		wg.Add(1)
// 		go calc(i)
// 	}
// 	wg.Wait()
// }

package main
import (
	"fmt"
	"sync"
	"time"
)
var wg sync.WaitGroup
//读写锁的应用场景
//读数据可以并发执行
//写数据只能串行执行
var mutex sync.RWMutex
func Read(){
	defer wg.Done()
	mutex.RLock()//读加锁  不能写 可以并发的读
	fmt.Printf("读取数据\n")
	time.Sleep(time.Millisecond*2000)
	mutex.RUnlock()
}
func Write(){
	defer wg.Done()
	mutex.Lock()//写加锁  不能并发的读和写 执行串行的写
	fmt.Printf("写入数据\n")
	time.Sleep(time.Millisecond*2000)
	mutex.Unlock()
}
func main(){
	for i:=1;i<=10;i++{
		wg.Add(1)
		go Read()
	}
	for i:=1;i<=10;i++{
		wg.Add(1)
		go Write()
	}
	wg.Wait()
}